package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

// 多个协程函数执行时，某个协程抛出异常但没有被处理时，抛出会终止所有协程
// 使用defer+recover处理错误，保证其他协程的正常进行

func test1() {
	// 捕捉可能异常
	defer func() {
		if err := recover(); err != nil {
			wg.Done()
			fmt.Println("test()发生过错误", err)
		} else {
			wg.Done()
		}

	}()

	// 定义一个map
	var myMap = map[int]string{
		1: "篮球",
	}
	// myMap = make(map[int]string)
	myMap[0] = "golang" // map类型未分配空间就使用，抛出错误

}

func test2() {
	for i := 0; i < 10; i++ {
		time.Sleep(time.Millisecond * 100)
		fmt.Println("hello, world")
	}
	wg.Done()
}

func main() {
	wg.Add(1)
	go test2()
	wg.Add(1)
	go test1()
	wg.Wait()
}
